#include "riscv.h"
#include "dev/timer.h"

// 16字节对齐的 CPU 栈空间，每个栈大小为 4096 字节
__attribute__ ((aligned (16))) uint8 CPU_stack[4096 * NCPU];

// 主程序入口
int main(); 

void start()
{
    // 设置为 S 模式并为 mret 准备好寄存器状态
    unsigned long x = r_mstatus();
    x = (x & ~MSTATUS_MPP_MASK) | MSTATUS_MPP_S;
    w_mstatus(x);

    // 设置返回地址为 main，禁用分页
    w_mepc((uint64)main);
    w_satp(0);

    // 委托所有中断和异常到 S 模式
    w_medeleg(0xffff);
    w_mideleg(0xffff);

    // 启用 SEIE、STIE、SSIE 中断
    w_sie(r_sie() | SIE_SEIE | SIE_STIE | SIE_SSIE);
    
    // 初始化时钟
    timer_init();
    
    // 设置 hart ID
    w_tp(r_mhartid());

    // 切换到 S 模式并跳转到 main
    asm volatile("mret");
}